﻿using SIIE_ERP.BaseDatos.Configuracion.Empresa.PagoLicencias;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIIE_ERP.Codigo;

using SIIE_ERP.BaseDatos.Configuracion;
using SIIE_ERP.BaseDatos.Configuracion.Empresa.PagoLicencias;
using SIIE_ERP.BaseDatos;

namespace SIIE_ERP.Codigo.Configuracion.PagoLicencias
{
    public class Licencias
    {

        /*POSIBLES códigos de retorno
       * Code_AmpliaAnio   -->  Amplía un año la licencia del usuario al que se le establece la licencia.
       * Code_AmpliaMes    -->  Amplía un mes la licencia del usuario al que se le establece la licencia.
       * Code_AmpliaPerpetual -->  Amplía 200 años la licencia del usuario al que se le establece la licencia.
       * Code_AmpliaPermanente -->  Amplía permanentemente la licencia del usuario al que se le establece la licencia.
       * CodeError1        -->  La llave ya fue usada o es inválida*/
        bool flag = false;
        string usuario;
        public DateTime fechaLicencia(int id, string clave, String RFC)
        {
            //Obtenemos la fecha de licencia
            DataTable dt_MisUsers = dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_Id_Rfc(RFC, id);
            //En el caso que ese usuario no tenga licencia
            if (dt_MisUsers.Rows.Count <= 0)
            {
                dt_MisUsers = dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_Id(id);
            }
            string[] CadenaLicencia = SIIE_ERP.BaseDatos.CypherClass.DescifrarTexto(dt_MisUsers.Rows[0]["Genero"].ToString()).Split('|');

            DateTime FechaAux = Convert.ToDateTime(CadenaLicencia[0].ToString().Substring(0, CadenaLicencia[0].ToString().Length - 5));
            if (DateTime.Now > FechaAux)
            {
                DateTime FechaCombina = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59);
                FechaAux = FechaCombina;
            }

            if (clave == "Code_AmpliaMes") return FechaAux.AddMonths(1);


            if (clave == "Code_AmpliaAnio") return FechaAux.AddYears(1);

            return FechaAux.AddYears(200);

        }
        public string cargaLicencia(int id, DateTime NuevaLicencia, string RFC, string Tipo_Licencia,string usuario)
        {
            try
            {
               // DataTable dt_MisUsers = dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_Id(id);

                switch (Tipo_Licencia)
                {
                    case "Code_AmpliaAnio":
                        if (dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_Id_Rfc(RFC.ToString(), id).Rows.Count > 0)
                        {
                            dbo_Sec_Usuario_RFC.Update_FechaLicencia(usuario, NuevaLicencia, RFC, "Anual", id.ToString(), 0);
                            return "Se ha actualizado su licencia exitosamente. Podrá ver los cambios la próxima vez que inicie sesión.";
                        }
                        dbo_Sec_Usuario_RFC.Insert_Sec_Usuario_RFC(id.ToString(), RFC, NuevaLicencia, usuario, "Anual", 0);
                        return "Se ha actualizado su licencia exitosamente. Podrá ver los cambios la próxima vez que inicie sesión.";
                        break;

                    case "Code_AmpliaMes":
                        if (dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_Id_Rfc(RFC.ToString(), id).Rows.Count > 0)
                        {
                            dbo_Sec_Usuario_RFC.Update_FechaLicencia(usuario, NuevaLicencia, RFC, "Mensual", id.ToString(), 0);
                            return "Se ha actualizado su licencia exitosamente. Podrá ver los cambios la próxima vez que inicie sesión.";
                        }
                        dbo_Sec_Usuario_RFC.Insert_Sec_Usuario_RFC(id.ToString(), RFC, NuevaLicencia, usuario, "Mensual", 0);
                        return "Se ha actualizado su licencia exitosamente. Podrá ver los cambios la próxima vez que inicie sesión.";
                        break;

                    case "Code_AmpliaPerpetual":

                        //Obtener si es el primer usuario con licencia perpertua
                        var permanente = primerPermanente(RFC);
                       
                        if (dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_Id_Rfc(RFC.ToString(), id).Rows.Count > 0)
                        {
                            //if (permanente == 1)
                            //{
                            //    dbo_Sec_Usuario_RFC.Insert_Sec_Usuario_RFC(id.ToString(), RFC, NuevaLicencia, usuario, "Perpetua", permanente);
                            //    return "Se ha actualizado su licencia exitosamente. Podrá ver los cambios la próxima vez que inicie sesión.";
                            //}
                            //else
                            //{
                                dbo_Sec_Usuario_RFC.Update_FechaLicencia(usuario, NuevaLicencia, RFC, "Perpetua", id.ToString(), permanente);
                                return "Se ha actualizado su licencia exitosamente. Podrá ver los cambios la próxima vez que inicie sesión.";
                           // }
                        }
                        dbo_Sec_Usuario_RFC.Insert_Sec_Usuario_RFC(id.ToString(), RFC, NuevaLicencia, usuario, "Perpetua", permanente);
                        return "Se ha actualizado su licencia exitosamente. Podrá ver los cambios la próxima vez que inicie sesión.";
                        break;

                    default:
                        break;
                }


            }

            catch (Exception)
            {
                return "No se ha podido actualizar su licencia.";
            }
            return "No se ha podido actualizar su licencia.";
        }

        public int primerPermanente(string RFC)
        {

            var genero = dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_RFC(RFC).Rows;
            for (int i = 0; i < genero.Count; i++)
            {
                string[] fechas = CypherClass.DescifrarTexto(genero[i]["Genero"].ToString()).Split('|');
                if (Convert.ToInt32(fechas[5]) == 1)
                {
                    flag = true;
                    //usuario = fechas[1];
                }

            }
            if (flag == false)
            {
                ActualizaLicencia(RFC);
                return 1;
            }
            else return 0;

        }

        public bool validacionLicenciaPerpetua(string RFC)
        {
            try
            {
                var genero = dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_RFC(RFC).Rows;
                for (int i = 0; i < genero.Count; i++)
                {
                    string[] fechas = CypherClass.DescifrarTexto(genero[i]["Genero"].ToString()).Split('|');
                    if (fechas[3].ToString().Equals("Perpetua")) return true;
                }

                return false;
            }
            catch (Exception)
            {

                return false;
            }

        }

        public void ActualizaLicencia(String RFC)
        {

            var genero = dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_RFC(RFC).Rows;

            for (int i = 0; i < genero.Count; i++)
            {
                string[] fechas = CypherClass.DescifrarTexto(genero[i]["Genero"].ToString()).Split('|');
                if (!fechas[1].ToString().Equals(usuario))
                {
                    //Actualizamos el tipo de licencia a Sin licencia para qye no se puedan logear hasta que su licencia sea perpetua
                    dbo_Sec_Usuario_RFC.Update_FechaLicencia_Perpetua(fechas[1].ToString(), Convert.ToDateTime(fechas[0].ToString().Substring(0, fechas[0].ToString().Length - 5)), RFC, genero[i]["Id_Usuario"].ToString(), 0);
                }
            }

        }
    }

}
